import { Method } from "../types";
import { deepMerge, isPlainObject } from "./util";

// 统一请求头大小写
function normalizeHeaderName(headers: any, normalizedName: string): void {
  if (!headers) {
    return
  }
  Object.keys(headers).forEach((name) => {
    // 若头名大小写不同但实际相同（如 'Content-Type' 和 'content-type'）
    if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
      headers[normalizedName] = headers[name] // 统一为目标大小写
      delete headers[name]  // 删除旧键，避免重复
    }
  })
}

export function processHeaders(headers: any, data: any): any {
  normalizeHeaderName(headers, 'Content-Type')

  if (isPlainObject(data)) {  // 数据是普通对象（如 { a: 1 }）
    if (headers && !headers['Content-Type']) { // 用户未设置 Content-Type
      headers['Content-Type'] = 'application/json;charset=utf-8'
    }
  }
  return headers
}

// 解析响应头字符串为对象
export function parseHeaders(headers: string): any {
  let parsed = Object.create(null)
  if (!headers) {
    return parsed
  }

  headers.split('\r\n').forEach(line => { // 按行分割
    let [key, ...vals] = line.split(':') // 分割键值对
    key = key.trim().toLowerCase()
    if (!key) {
      return
    }
    const val = vals.join(':').trim()
    parsed[key] = val
  })

  return parsed
}

export function flattenHeaders(headers: any, method: Method): any {
  if (!headers) {
    return headers
  }
  // 合并 common 头、方法特定头、普通头（deepMerge 确保深层合并）
  headers = deepMerge(headers.common, headers[method], headers)
  // 删除方法特定头和 common 头（避免冗余
  const methodsToDelete = ['delete', 'get', 'head', 'options', 'post', 'put', 'patch', 'common']

  methodsToDelete.forEach(method => {
    delete headers[method]
  })

  return headers
}


/* 
用户配置 headers: { common: { Authorization: 'Bearer' }, post: { 'X-Custom': 'post' } }
  ↓ flattenHeaders 合并：
- 合并 common 和 post 头 → { Authorization: 'Bearer', X - Custom: 'post' }
- 删除 common 和 post 键，得到最终头对象
  ↓ processHeaders 处理：
- 数据是对象且无 Content - Type → 自动添加 'application/json'
  - 统一 Content - Type 大小写为 'content-type'
  ↓ 发送请求：头信息包含自动设置的 Content - Type 和合并后的自定义头 */

